home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / mac / files / amiga / csrc720j.lzh / rexx.c < prev    next >
C/C++ Source or Header  |  1993-04-06  |  3KB  |  126 lines

  1. #include "rexxhostbase.h"
  2. #include <stdio.h>
  3. #include "mb.h"
  4.  
  5. struct RexxHostBase  *RexxHostBase;
  6.  
  7. extern char optflags[];
  8. struct RexxHost      *rexx_host;
  9. struct MsgPort *non_rexx = 0L;
  10. long rexxbit = 0L;
  11. extern char tmpstr[];
  12. char *portname = "CBBS-A";
  13. extern char hostport;
  14. /* Try to open the rexxhost.library. Option G (6) turns REXX off */
  15. open_rexx()
  16. {
  17.  
  18.    portname[5] = hostport;
  19.    if(!optflags[6]) {
  20.       non_rexx = CreatePort((UBYTE *)portname,0L);
  21.       return(0);
  22.    }
  23.    if(!(RexxHostBase = (struct RexxHostBase *)
  24.              OpenLibrary((UBYTE *)REXXHOSTNAME,(long)REXXHOSTMINIMUM))) {
  25.       printf("couldn't open rexxhost library.\n");
  26.       return(1);
  27.    }
  28.  
  29.       /* set up a public port for rexx to talk to us later */
  30.  
  31.    if(!(rexx_host = CreateRexxHost((STRPTR)portname)))   {
  32.       printf("Can't set up public rexx port for port %c\n",hostport);
  33.       CloseLibrary((struct Library *)RexxHostBase);
  34.       return(1);
  35.    }
  36.    rexxbit = (1L << rexx_host->rh_Port.mp_SigBit);
  37.    return(0);
  38. }
  39. close_rexx()
  40. {
  41.    struct RexxMsg *rexxmessage;  /* incoming rexx messages */
  42.    STRPTR Arg;
  43.  
  44.    if(!optflags[6]) {
  45.       DeletePort(non_rexx);
  46.       return;
  47.    }
  48. /* Drain any messages for us */
  49.    while(rexxmessage = GetRexxMsg(rexx_host,0L)) {
  50.       if(Arg = GetRexxCommand(rexxmessage)) {
  51.          ReplyRexxCommand(rexxmessage,0L,0L,0L);
  52.       }
  53.       else {
  54.          FreeRexxCommand(rexxmessage);
  55.       }
  56.    }
  57.    if(rexx_host)
  58.       rexx_host = DeleteRexxHost(rexx_host);
  59.  
  60.    if(RexxHostBase)
  61.       CloseLibrary((struct Library *)RexxHostBase);
  62. }
  63. testport()
  64. {
  65.    if(!optflags[6])return;
  66.    portname[5] = hostport;
  67.    if(FindPort((UBYTE *)portname)) {
  68.       printf("There's already a process on port '%c'\n",hostport);
  69.       return(1);
  70.    }
  71.    return(0);
  72. }
  73.  
  74. /* This routine can only be called from SYSOP. */
  75. putcomd(a,b)
  76. char a,b;
  77. {
  78.    char data[3];
  79.    STRPTR rexxname;
  80.    char portchar;
  81.    register PORTS *p;
  82.  
  83.    if(!optflags[6])return;
  84.    /* Do AI - forward on all ports.
  85.       a and b are the A command changed to an X .. eg AI will be input as XI
  86.    */
  87.    if((b == ' ') || (b == 'I')) {
  88.       for(p = porthd; p isnt NULL; p = p->next) {
  89.          if(p->id == 'Z')continue;
  90.          rexxname = (STRPTR)"CBBS-A";
  91.          rexxname[5] = p->id;
  92.          data[0] = a;
  93.          data[1] = b;
  94.          data[2] = 0;
  95.          if(SendRexxMsg(rexxname,0L,(STRPTR)data,1L) == 0) {
  96.             sprintf(tmpstr,"Can't find port %c\n",p->id);
  97.             ttputs(tmpstr);
  98.          }
  99.       }
  100.       return;
  101.    }
  102.    portchar = 0;
  103.    if(isdigit(b)) {
  104.       portchar = b ^ 0x70;
  105.       b = ' ';
  106.    }
  107.    else {
  108.       if(isalpha(b)) {
  109.          portchar = toupper(b);
  110.          b = 'I';
  111.       }
  112.    }
  113.    if((portchar == 0) || ((portchar < 'A') && (portchar > 'P'))) {
  114.       ttputs("Unrecognized port\n");
  115.       return;
  116.    }
  117.    rexxname = (STRPTR)"CBBS-A";
  118.    rexxname[5] = portchar;
  119.    data[0] = a;
  120.    data[1] = b;
  121.    data[2] = 0;
  122.    if(SendRexxMsg(rexxname,0L,(STRPTR)data,1L))return;
  123.    sprintf(tmpstr,"Can't find port %c\n",portchar);
  124.    ttputs(tmpstr);
  125. }
  126.